import keras
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

(x_train, y_train), (x_test, y_test) = mnist.load_data()

print('样本数，  ， ')
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# im = plt.imshow(x_train[0], cmap='gray')
# plt.show()
y_train[0]

# x标签处理
x_train = x_train.reshape(60000, 28*28)
x_test = x_test.reshape(10000, 28*28)
x_train = x_train / 255
x_test = x_test / 255

# y标签处理
# 5 -> [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# 构建模型
model = Sequential()
# 第一个隐藏层
model.add(Dense(512, activation='relu', input_shape=(28*28,)))
# 第二个隐藏层
model.add(Dense(256, activation='relu'))
#  输出层
model.add(Dense(10, activation='softmax'))
model.summary()

# 模型编译
model.compile(optimizer=SGD(), loss='categorical_crossentropy',metrics=['accuracy'])

# 模型训练
model.fit(x_train, y_train, batch_size=64, epochs=5, validation_data=(x_test, y_test))

# 训练结构评估
score = model.evaluate(x_test, y_test)
print('LOSS', score[0],"\n损失值（Loss）：这是模型在测试集上的损失，通常是你在编译模型时指定的损失函数（如categorical_crossentropy、mean_squared_error等）计算得出的。损失值越小，通常表示模型在测试集上的性能越好")
print('ACCU', score[1],"\n准确率（Accuracy）：这是模型在测试集上的分类准确率（对于分类任务）或其他类型的性能度量（对于其他类型的任务，如回归或序列预测）。准确率是一个介于0和1之间的值，表示模型正确预测样本的比例。对于分类任务，准确率越高，通常表示模型在测试集上的性能越好。")